package com.hhf.spring.config;

import com.hhf.spring.bean.Cat;
import com.hhf.spring.bean.Person;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.*;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @Import({Person.class, MainConfig.MyImportRegistrar.class})
 * 先注册一个普通的类信息，而后面是注册一个注册者
 */
//@Import({ MainConfig.MyImportRegistrar.class})
@ComponentScan("com.hhf.spring")
@Configuration
public class MainConfig {


	public MainConfig(){
		System.out.println("MainConfig..创建了....");
	}

//	@Bean
//	public Person person(){
//		Person person = new Person();
//		person.setName("李四");
//		return person;
//	}

	//static class MyImportRegistrar implements ImportBeanDefinitionRegistrar{
		//注册一个bean的信息
		/**
		 *
		 * registerBeanDefinitions：注册一个bean的定义信息
		 *
		 * @param importingClassMetadata annotation metadata of the importing class
		 * BeanDefinitionRegistry：  bean定义信息的注册中心：举个例子：它是图纸中心，要造的所有东西的图纸，都在这，
		 *           	也就是说每个bean的详细信息，它的class是什么，它标注了哪些注解等，这就叫bean的定义信息注册中心
		 *            	所以spring的底层是这样工作的：
		 *                   1.在xml/注解里面配置了一大堆组件以后，spring底层肯定要把xml文件/注解这些的信息读取出来
		 *                   2.这些信息读取出来的是一个一个的组件或者是功能的这些配置，这些配置也叫定义
		 *                   3.它把这些配置最终所有的这些定义信息都放在spring里面的资料库档案馆里边，资料库里面(BeanDefinitionRegistry)
		 *                   4.这个资料库里面就是所说的图纸，这也就叫bean定义的注册中心
		 *                   也就是说bean真正要创建对象，得先告诉它一个模板，一个图纸
		 *                    其实给spring容器中注册东西，是来注册bean定义信息的
		 *
		 *              既然这叫BeanDefinitionRegistry，它里面都是飞机的仓库，那里面都是飞机，如果叫飞机的定义仓库，那仓库里面都是图纸
		 *						也就是说它里面都是BeanDefinition，都是bean的定义信息
		 *				以后所有的bean，要创建什么样子类型的对象，它的名字叫什么全部都在BeanDefinitionRegistry里面存着
		 *				但BeanDefinitionRegistry不能给属性赋值，因为这个东西只可以声明bean的定义信息，包括可以自动装配一些东西
		 *
		 */
//		@Override
//		public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
//											BeanDefinitionRegistry registry) {
//				//想要给档案馆里面注册这个bean，就得先有这个bean的定义信息，而这个定义信息就是BeanDefinition
//
//			//准备一个bean的定义信息,定义一个猫的定义信息，并告诉spring 猫该怎么造
//			//而spring要造这个定义信息，spring肯定得知道这个实例的类型，还得知道这个实例的名字，不过实例的名字已经在registerBeanDefinition里面写好了
//			RootBeanDefinition catDefinition = new RootBeanDefinition();
//			//定义类型
//			catDefinition.setBeanClass(Cat.class);  //设置当前组件的类的类型是什么
//
//			/**
//			 * 注册bean的定义信息
//			 * 第一个参数：给组件起一个名字
//			 * 第二个参数：把这个组件的定义信息定义出来
//			 * 			这块定义信息就是用BeanDefinition来进行定义
//			 */
//			registry.registerBeanDefinition("tomCat",catDefinition);//注册一个bean定义信息
//		}
//	}
}
